widget: Clip drawing to the widget's allocation.
authorBenjamin Otte <otte@redhat.com>
Tue, 14 Sep 2010 14:35:12 +0000 (16:35 +0200)
committerBenjamin Otte <otte@redhat.com>
Sun, 26 Sep 2010 13:11:42 +0000 (15:11 +0200)
I've seen (and written) quite some widgets (and theme engines) that use
cairo_paint() to draw the background. So avoiding overdraw makes sense.

Also move all that setup into a _gtk_widget_draw_internal() function
that will be used by all functions that can be used by other functions
that draw widgets.

gtk/gtkwidget.c
gtk/gtkwidget.h

index 8494855e7e794d0c38152dd341fe5e2ff2f29099..3a41b72fe8fc90265b52e698f9122ec4404b17b2 100644 (file)
@@ -5119,6 +5119,32 @@ gtk_cairo_should_draw_window (cairo_t *cr,
          event->window == window;
 }
 
+/* code shared by gtk_container_propagate_draw() and
+ * gtk_widget_draw()
+ */
+void
+_gtk_widget_draw_internal (GtkWidget *widget,
+                           cairo_t   *cr)
+{
+  if (!gtk_widget_is_drawable (widget))
+    return;
+
+  cairo_rectangle (cr, 
+                   0, 0,
+                   widget->priv->allocation.width,
+                   widget->priv->allocation.height);
+  cairo_clip (cr);
+
+  if (gdk_cairo_get_clip_rectangle (cr, NULL))
+    {
+      gboolean result;
+
+      g_signal_emit (widget, widget_signals[DRAW], 
+                     0, cr,
+                     &result);
+    }
+}
+
 static gboolean
 gtk_widget_real_expose_event (GtkWidget      *widget,
                              GdkEventExpose *expose)
@@ -5166,9 +5192,7 @@ gtk_widget_real_expose_event (GtkWidget      *widget,
                        widget->priv->allocation.y);
     }
 
-  g_signal_emit (widget, widget_signals[DRAW], 
-                 0, cr,
-                 &result);
+  _gtk_widget_draw_internal (widget, cr);
 
   /* unset here, so if someone keeps a reference to cr we
    * don't leak the window. */
index 3c58cd7fd257074649202b4c2aa4d9634735b40e..3ab1bd43e8b4b450ad8def0c19a70cd914bbccda 100644 (file)
@@ -947,8 +947,10 @@ GtkRequisition *gtk_requisition_new      (void) G_GNUC_MALLOC;
 GtkRequisition *gtk_requisition_copy     (const GtkRequisition *requisition);
 void            gtk_requisition_free     (GtkRequisition       *requisition);
 
-GdkEventExpose *  _gtk_cairo_get_event                    (cairo_t     *cr);
+GdkEventExpose *  _gtk_cairo_get_event                    (cairo_t      *cr);
 
+void              _gtk_widget_draw_internal               (GtkWidget    *widget,
+                                                           cairo_t      *cr);
 void              _gtk_widget_set_has_default             (GtkWidget    *widget,
                                                            gboolean      has_default);
 void              _gtk_widget_set_has_grab                (GtkWidget    *widget,